Previous slide Next slide Toggle fullscreen Open presenter view
Banco de Dados
Aula 05 - SQL I: Construindo o Banco (DDL)
Helder Jefferson Ferreira da Luz
helder.luz@ifpr.edu.br
Objetivos da aula
Aprender a sub-linguagem DDL para definir a estrutura das tabelas.
Conhecer alguns tipos de dados para armazenamento no BD.
SQL
SQL (Structured Query Language) é a linguagem padrão para interagir com bancos de dados relacionais.
É uma linguagem declarativa : Você diz o que quer, não como fazer.
É padronizada (ANSI/ISO) : Os comandos básicos são os mesmos no MySQL, PostgreSQL, SQL Server, etc. (Agnóstica!)
Possui "sub-linguagens" para diferentes tipos de tarefas.
As Sub-linguagens do SQL
DDL (Data Definition Language) : Define e gerencia a estrutura do BD.
DML (Data Manipulation Language) : Manipula os dados.
DQL (Data Query Language) : Consulta os dados.
DCL (Data Control Language) : Gerencia permissões.
Nessa aula o foco é DDL .
Tipos de Dados Comuns
Todo dado em uma coluna precisa ter um tipo. Os tipos padrão (agnósticos) mais comuns são:
Categoria
Tipos Comuns
Descrição
Numéricos
INTEGER ou INT
Números inteiros.
NUMERIC(p, s) ou DECIMAL(p, s)
Números decimais com precisão p e s casas decimais. Ex: NUMERIC(10, 2) para preços.
Texto
CHAR(n)
String de tamanho fixo n.
VARCHAR(n)
String de tamanho variável até n. O mais usado para textos.
TEXT
Para textos longos, sem limite definido.
Data/Hora
DATE
Armazena data (YYYY-MM-DD).
TIME
Armazena hora (HH:MM:SS).
TIMESTAMP ou DATETIME
Armazena data e hora juntos.
Lógicos
BOOLEAN
Armazena TRUE ou FALSE.
DDL
Data Definition Language
CREATE ALTER DROP
DDL: Começando pelo Começo
Antes de criar tabelas, é necessário um lugar para colocá-las: um banco de dados .
1. Criando o Banco de Dados
CREATE DATABASE nome_do_banco;
Este comando cria um novo "container" para as tabelas.
2. Selecionando o Banco de Dados
Depois de criar, você precisa "entrar" no banco para poder trabalhar nele.
USE nome_do_banco;
A partir daqui, todos os comandos serão executados dentro deste banco de dados.
CREATE TABLE: Construindo a Estrutura
O comando CREATE TABLE cria uma nova tabela no banco de dados.
Sintaxe básica:
CREATE TABLE nome_da_tabela (
nome_coluna1 tipo_de_dado [constraints],
nome_coluna2 tipo_de_dado [constraints],
...
[constraints_de_tabela]
);
Constraints (Restrições) são regras aplicadas às colunas para garantir a integridade dos dados.
Constraints Essenciais
NOT NULL: A coluna não pode ter valores nulos.
UNIQUE: Todos os valores na coluna devem ser únicos.
PRIMARY KEY: Define a coluna como chave primária (NOT NULL e UNIQUE são implícitos).
FOREIGN KEY: Cria um relacionamento com a chave primária de outra tabela.
DEFAULT valor: Define um valor padrão para a coluna se nenhum for fornecido.
CHECK (condição): Garante que os valores satisfaçam uma condição.
Exemplo: Criando a Tabela CLIENTE
Vamos traduzir nosso modelo ER para SQL.
Modelo: CLIENTE { int id PK, string nome, string email, string cpf }
SQL:
CREATE TABLE cliente (
id INTEGER PRIMARY KEY AUTO_INCREMENT,
nome VARCHAR (100 ) NOT NULL ,
email VARCHAR (100 ) UNIQUE NOT NULL ,
cpf CHAR (11 ) UNIQUE NOT NULL ,
data_nascimento DATE
);
Nota: A forma de auto-incremento da PK varia. No PostgreSQL é SERIAL ou GENERATED AS IDENTITY.
Exemplo: PRODUTO
Tabela PRODUTO:
CREATE TABLE produto (
id INTEGER PRIMARY KEY ,
nome VARCHAR (100 ) NOT NULL ,
descricao TEXT,
preco NUMERIC (10 , 2 ) NOT NULL CHECK (preco > 0 )
);
Exemplo: PEDIDO
Tabela PEDIDO (com a Foreign Key):
CREATE TABLE pedido (
id INTEGER PRIMARY KEY ,
data_pedido TIMESTAMP DEFAULT CURRENT_TIMESTAMP ,
status VARCHAR (20 ) DEFAULT 'Pendente' ,
id_cliente INTEGER NOT NULL ,
FOREIGN KEY (id_cliente) REFERENCES cliente(id)
);
A FOREIGN KEY garante que todo id_cliente na tabela pedido deve existir na tabela cliente.
Exemplo: A Tabela de Junção ITEM_PEDIDO
Lembre-se que a PK aqui é composta.
CREATE TABLE item_pedido (
id_pedido INTEGER NOT NULL ,
id_produto INTEGER NOT NULL ,
quantidade INTEGER NOT NULL DEFAULT 1 ,
preco_unitario NUMERIC (10 , 2 ) NOT NULL ,
PRIMARY KEY (id_pedido, id_produto),
FOREIGN KEY (id_pedido) REFERENCES pedido(id),
FOREIGN KEY (id_produto) REFERENCES produto(id)
);
Isso implementa o relacionamento N:M e garante a integridade referencial.
ALTER TABLE: Modificando o que já existe
E se você esqueceu uma coluna ou precisa mudar um tipo de dado?
Adicionar uma coluna:
ALTER TABLE cliente ADD COLUMN data_cadastro DATE ;
Remover uma coluna:
ALTER TABLE cliente DROP COLUMN data_cadastro;
Modificar tipo de dado de uma coluna:
ALTER TABLE cliente MODIFY COLUMN nome VARCHAR (150 );
(Sintaxe pode variar: no PostgreSQL é ALTER COLUMN ... TYPE ...)
ALTER TABLE: Modificando o que já existe
Adicionar uma CONSTRAINT (como uma Foreign Key):
ALTER TABLE pedido
ADD CONSTRAINT fk_cliente FOREIGN KEY (id_cliente) REFERENCES cliente(id);
Múltiplas modificações de uma vez
ALTER TABLE pedido
ADD COLUMN id_cliente INTEGER ,
ADD CONSTRAINT fk_cliente
FOREIGN KEY (id_cliente) REFERENCES cliente(id);
(A sintaxe para múltiplas ações pode variar um pouco entre SGBDs)
DROP TABLE: Removendo uma Tabela
Cuidado: este comando é permanente e apaga a tabela e todos os seus dados!
DROP TABLE nome_da_tabela;
Você não conseguirá apagar uma tabela se outra depender dela por uma FOREIGN KEY. Você precisaria apagar a tabela dependente primeiro.
Dúvidas?
Exercícios
Crie a Tabela CATEGORIA : Escreva o comando CREATE TABLE para uma tabela categoria com as colunas:
id (inteiro, chave primária)
nome (texto de até 50 caracteres, único e não nulo)
descricao (texto longo)
Altere a Tabela PRODUTO : Escreva o comando ALTER TABLE para adicionar uma chave estrangeira na tabela produto que se relacione com a tabela categoria. Chame a nova coluna de id_categoria.
Exercícios
Relacionamento 1:1 : Escreva o CREATE TABLE para uma tabela endereco_entrega que se relaciona com CLIENTE (um cliente tem um endereço de entrega). A tabela deve ter id, logradouro, numero, cidade, cep e a FK para cliente.
Diagrama final
- **Sub-linguagens do SQL**: DDL, DML, DQL e DCL.
- **Comandos Essenciais**: `CREATE TABLE`, `ALTER TABLE`, `DROP TABLE`.
- **Constraints**: Impondo regras nos seus dados (`PRIMARY KEY`, `FOREIGN KEY`, `NOT NULL`).
- **Mão na Massa**: Escrevendo o SQL para criar as tabelas da nossa Loja.
: A Língua Universal dos Bancos de Dados
(para `DATABASE`, `TABLE`, `INDEX`, etc.)
-- No PostgreSQL (via psql)
\c nome_do_banco;
```mermaid
erDiagram
CLIENTE {
int id PK
string nome
string email
string cpf
}
```
CREATE TABLE categoria (
id INTEGER PRIMARY KEY AUTO_INCREMENT,
nome VARCHAR(50) UNIQUE NOT NULL,
descricao TEXT
)
ALTER TABLE produto
ADD COLUMN id_categoria INT;
ALTER TABLE produto
ADD CONSTRAINT fk_categoria
FOREIGN KEY (id_categoria) REFERENCES categoria(id);
**** versão com um único comando ****
ALTER TABLE produto
ADD COLUMN id_categoria INT,
ADD CONSTRAINT fk_categoria FOREIGN KEY (id_categoria) REFERENCES categoria(id);
CREATE TABLE endereco_entrega (
id_cliente INTEGER PRIMARY KEY,
logradouro VARCHAR(100) NOT NULL,
numero INTEGER NOT NULL,
cidade VARCHAR(50) NOT NULL,
cep VARCHAR(10) NOT NULL,
FOREIGN KEY (id_cliente) REFERENCES cliente(id)
)
4. **Desafio**: Como você faria para garantir que o `email` de um cliente sempre contenha o caractere `@`? (Dica: use a constraint `CHECK`).